package com.example.demo.common;

import com.example.demo.component.LoginInterceptor;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: DELL
 * Date: 2023-06-17
 * Time: 11:47
 */
@Component("IpFilter")
public class IpFilter {
    // 类成员变量
    private final Map<String, Integer> accessCount = new ConcurrentHashMap<>(); // 用于存储每个 IP 地址的访问次数

    // 方法用于将指定的 IP 地址添加到黑名单列表中，并将其对应的访问次数重置为 0
    public void blockIp(String ip) {
        // 添加指定 IP 地址到黑名单中
        accessCount.put(ip, 0);
    }
    // 方法用于将指定的 IP 地址从黑名单列表中移除
    public void unblockIp(String ip) {
        // 将指定 IP 地址从黑名单中移除
        accessCount.remove(ip);
    }

    // 方法用于判断指定的 IP 地址是否在黑名单列表中。如果是，那么说明该 IP 地址受到访问限制
    public boolean isIpBlocked(String ip) {
        // 判断指定 IP 地址是否在黑名单中
        Integer count = accessCount.get(ip);
        // 如果访问次数大于阈值, 拉入黑名单
        return count != null && count >= 3;
    }

    // 方法用于返回所有在黑名单列表中的 IP 地址及其对应的访问次数
    public Map<String, Integer> getBlockedIps() {
        // 获取所有在黑名单中的 IP 地址列表
        Map<String, Integer> blockedIps = new HashMap<>();
        for (Map.Entry<String, Integer> entry : accessCount.entrySet()) {
            String ip = entry.getKey();
            Integer count = entry.getValue();
            // 如果指定 IP 地址的访问次数大于等于阈值，那么将其添加到黑名单列表中
            if (count >= 3) {
                blockedIps.put(ip, count);
            }
        }
        return blockedIps;
    }

    // 方法用于清空黑名单列表，并将所有 IP 地址的访问次数重置为 0
    public void clearBlockedList() {
        // 清空黑名单列表，并重置所有 IP 地址的访问次数为 0
        accessCount.clear();
    }
}
